<?php

App::uses('AppController', 'Controller');

/**
 * Users Controller
 *
 * @property User $User
 * @property PaginatorComponent $Paginator
 */
class UsersController extends AppController
{
    /**
     * Components
     *
     * @var array
     */
    public $components = array('Paginator','RequestHandler','DataTable');
    public $uses = array(
        'User',
        'Banco',
        'Categoria',
        'Parametro',
        'Movimiento',
        'Paise','Tcambio',
        'Ciudade');
    public $layout = 'sib';

    /**
     * index method
     *
     * @return void
     */
    /*public function beforeFilter()
    {
        parent::beforeFilter();
        $this->Auth->allow();
    }*/

    public function index()
    {
        $users = $this->User->find('all', array(
            'recursive' => -1,
            'limit' => 50,
            'order' => 'User.id',
            'conditions'=>array('User.role'=>array('Administrador','Secretaria'))));
        $this->set(compact('users'));
        //debug($users);die;
    }


    /**
     * view method
     *
     * @throws NotFoundException
     * @param string $id
     * @return void
     */
    public function view($id = null)
    {
        if (!$this->User->exists($id)) {
            throw new NotFoundException(__('Invalid user'));
        }
        $options = array('conditions' => array('User.' . $this->User->primaryKey => $id));
        $this->set('user', $this->User->find('first', $options));
    }

    /**
     * add method
     *
     * @return void
     */
    public function usuario($idUsuario = null)
    {
        if (!empty($this->request->data)) {
            $validar = $this->validar('User');
            if(empty($validar))
            {
                if(!empty($this->request->data['User']['password_n']))
                {
                    $this->request->data['User']['password'] = $this->request->data['User']['password_n'];
                }
                $this->User->create();
                if ($this->User->save($this->request->data['User'])) {
                    $this->Session->setFlash('El usuario se registro correctamente', 'msgbueno');
                    $this->redirect(array('action' => 'index'));
                } else {
                    $this->Session->setFlash('No se pudo registrar el Usuario','msgerror');
                    $this->redirect(array('action' => 'index'));
                }
            }
            else{
                $this->Session->setFlash($validar,'msgerror');
                $this->redirect(array('action' => 'index'));
            }
            
        }
        else{
            $this->User->id = $idUsuario;
            $this->request->data = $this->User->read();
        }
    }

    /**
     * edit method
     *
     * @throws NotFoundException
     * @param string $id
     * @return void
     */
    public function edit($id = null)
    {
        $this->User->id = $id;
        if (!$id) {
            $this->Session->setFlash('No existe el Titulo');
            $this->redirect(array('action' => 'index'), null, true);
        }
        if (empty($this->request->data)) {
            $this->request->data = $this->User->read();
        } else {
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash('Los datos fueron modificados', 'mensajeBueno');
                $this->redirect(array('action' => 'index'), null, true);
            } else {
                $this->Session->setFlash('no se pudo modificar!!','mensajeError');
            }
        }
        $categorias = $this->User->Categoria->find('list');
        $ciudades = $this->User->Ciudade->find('list');
        $paises = $this->User->Paise->find('list');
        $bancos = $this->User->Banco->find('list');
        $this->set(compact('categorias', 'ciudades', 'paises', 'bancos'));
    }

    /**
     * delete method
     *
     * @throws NotFoundException
     * @param string $id
     * @return void
     */
    public function delete($id = null)
    {
        $this->User->id = $id;
        $this->request->data = $this->User->read();
        if (!$id) {
            $this->Session->setFlash('No existe el Usuario a Eliminar');
            $this->redirect($this->referer());
        } else {
            if ($this->User->delete($id)) {
                $this->Movimiento->deleteAll(array('Movimiento.user_id' => $id));
                $this->Session->setFlash('Se elimino el Usuario ' . $this->data['User']['nombres'],
                    'mensajeBueno');
                $this->redirect($this->referer());
            } else {
                $this->Session->setFlash('Error al eliminar','mensajeError');
            }
        }
    }

    public function preinscripcion()
    {
        if ($this->request->is('post')) {
            $valida = $this->validar('User');
            //debug($valida); die;
            if(empty($valida))
            {
                $this->User->create();
                $this->request->data['User']['role'] = 'Colegiado';
                if ($this->User->save($this->request->data['User'])) {
                    $idUsuario = $this->User->getLastInsertID();
                    $fInicial = $this->request->data['User']['fecha_titulo'];
                    $this->genera_pagos($idUsuario, $fInicial);
                    $this->Session->setFlash('Pre Inscripcion registrada con exito','msgbueno');
                    $this->redirect(array('controller'=>'Users','action' => 'colegiados'));
                } else {
                    $this->Session->setFlash('No se pudo registrar la Pre Inscripcion','msgerror');
                    $this->redirect(array('controller'=>'Users','action' => 'colegiados'));
                }
            }
            else{
                $this->Session->setFlash($valida,'msgerror');
                $this->redirect(array('controller'=>'Users','action' => 'colegiados'));
            }
        }
        $dcategorias = $this->Categoria->find('list', array('fields' =>
                'Categoria.nombre'));
        $dbancos = $this->Banco->find('list', array('fields' => 'Banco.nombre'));
        $this->set(compact('dbancos', 'dcategorias'));
        //debug($dbancos);die;
    }
    public function genera_pagos($idUsuario = null,$cFecha = null)
    {
        $usuario = $this->User->find('first',array('recursive' => -1
            ,'fields' => array('User.tipo')
            ,'conditions' => array('User.id' => $idUsuario)));
        $parametros = $this->Parametro->find('all',array('conditions' => array('Parametro.estado' => 1)));
        foreach($parametros as $pa)
        {
            if($pa['Parametro']['tipo'] == 'Todos' || $usuario['User']['tipo'] == $pa['Parametro']['tipo'])
            {
                 if($pa['Parametro']['frecuencia'] == 'una')
                {
                    $this->genera_cuota($idUsuario,$cFecha,$pa['Parametro']['cuota'],  $this->get_tipo_cambio(),$pa['Parametro']['moneda'],$pa['Parametro']['id']);
                }
                elseif($pa['Parametro']['frecuencia'] == 'mensual')
                {
                    $veces = $this->genera_meses($cFecha, date('Y-m-d'));
                    foreach ($veces as $ve)
                    {
                        $this->genera_cuota($idUsuario,$ve['fecha'],$pa['Parametro']['cuota'],  $this->get_tipo_cambio(),$pa['Parametro']['moneda'],$pa['Parametro']['id']);
                    }
                }
                elseif($pa['Parametro']['frecuencia'] == 'anual')
                {
                    $veces = $this->genera_anual($cFecha, date('Y-m-d'));
                    foreach ($veces as $ve)
                    {
                        $this->genera_cuota($idUsuario,$ve['fecha'],$pa['Parametro']['cuota'],  $this->get_tipo_cambio(),$pa['Parametro']['moneda'],$pa['Parametro']['id']);
                    }
                }
            }
        }
    }
    public function get_tipo_cambio()
    {
        $cambio = 0.00;
        $tcambio = $this->Tcambio->find('first',array('order' => 'Tcambio.id DESC'));
        if(!empty($tcambio))
            $cambio = $tcambio['Tcambio']['cambio'];
        return $cambio;
    }
    public function genera_cuota($idUsuario = NULL,$cFecha = NULL,$cuota = NULL,$tc = NULL,$moneda = NULL,$idParametro = NULL)
    {
        if(!empty($idUsuario) && !empty($cFecha) && !empty($cuota) && !empty($tc) && !empty($moneda))
        {
                    $this->request->data['Movimiento']['user_id'] = $idUsuario;
                    $this->request->data['Movimiento']['fecha_cuota'] = $cFecha;
                    $this->request->data['Movimiento']['cuota'] = $cuota;
                    $this->request->data['Movimiento']['ingreso'] = $cuota;
                    $this->request->data['Movimiento']['tc'] = $tc;
                    $this->request->data['Movimiento']['moneda'] = $moneda;
                    $this->request->data['Movimiento']['estado'] = 'Debe';
                    $this->request->data['Movimiento']['parametro_id'] = $idParametro;
                    $this->Movimiento->create();
                    $this->Movimiento->save($this->request->data['Movimiento']);
        }
                    
    }
    public function genera_cuotas($cuota = null,$tc = null,$moneda = null,$idUsuario = null,$fInicial = null,$fFinal = null)
    {
                $fi = $fInicial;
                $ff = $fFinal;
                
                $fIni = new DateTime($fInicial);
                $fFin = new DateTime($fFinal);
                $diferencia = $fIni->diff($fFin);
                $meses = ($diferencia->y * 12) + $diferencia->m;

                $fechai = explode("-", $fi);

                $cMeses = $fechai[1];

                $cAnos = $fechai[0];

                for ($i = 0; $i < $meses; $i++) {
                    $cMeses++;
                    if ($cMeses == 13) {
                        $cAnos++;
                        $cMeses = 1;
                    }
                    $cFecha = date("Y-m-d", mktime(0, 0, 0, $cMeses, 1, $cAnos));
                    $this->request->data['Movimiento']['user_id'] = $idUsuario;
                    $this->request->data['Movimiento']['fecha_cuota'] = $cFecha;
                    $this->request->data['Movimiento']['cuota'] = $cuota;
                    $this->request->data['Movimiento']['ingreso'] = $cuota;
                    $this->request->data['Movimiento']['tc'] = $tc;
                    $this->request->data['Movimiento']['moneda'] = $moneda;
                    $this->request->data['Movimiento']['estado'] = 'Debe';
                    $this->Movimiento->create();
                    $this->Movimiento->save($this->request->data['Movimiento']);
                }
    }
    public function genera_meses($fInicial = null,$fFinal = null)
    {
        if(!empty($fInicial) && !empty($fFinal))
        {
            $fi = $fInicial;
                $ff = $fFinal;
                $fIni = new DateTime($fInicial);
                $fFin = new DateTime($fFinal);
                $diferencia = $fIni->diff($fFin);
                $meses = ($diferencia->y * 12) + $diferencia->m;
                $fechai = explode("-", $fi);
                $cMeses = $fechai[1];
                $cAnos = $fechai[0];
                $array =  array();
                for ($i = 0; $i < $meses; $i++) {
                    $cMeses++;
                    if ($cMeses == 13) {
                        $cAnos++;
                        $cMeses = 1;
                    }
                    $cFecha = date("Y-m-d", mktime(0, 0, 0, $cMeses, 1, $cAnos));
                    $array[$i]['fecha'] = $cFecha;
                }
                return $array;
        }
        else{
            return array();
        }
    }
    public function genera_anual($fInicial = null,$fFinal = null)
    {
        $fInicial = split('-', $fInicial);
        $fFinal = split('-', $fFinal);
        if($fFinal[1] > $fInicial[1])
        {
            $anos = $fFinal[0] - $fInicial[0];
        }
        elseif($fFinal[1] == $fInicial[1] && $fFinal[2] >= $fInicial[2]){
            $anos = $fFinal[0] - $fInicial[0];
        }
        else{
            $anos = $fFinal[0] - $fInicial[0] - 1;
        }
        $array = array();
        $canos = $fInicial[0]+1;
        for($i = 0;$i < $anos ;$i++)
        {
            $fecha = $canos.'-'.$fInicial[1].'-'.$fInicial[2];
            $array[$i]['fecha'] = $fecha;
            $canos++;
        }
        return $array;
        //debug($array);exit;
    }
    public function colegiados()
    {
        
        //debug($webroot);exit;
        if($this->RequestHandler->responseType() == 'json')
        { 
            
            $acc_edit = '<a class="btn btn-xs btn-primary" href="../Users/colegiado/'."',User.id,'".'"  title="Editar"><i class="fa fa-pencil fa-fw"></i></a>';
            $acc_pendientes = '<a class="btn btn-xs btn-success" href="../Movimientos/add/'."',User.id,'".'"  title="Pagos pendientes"><i class="fa fa-money fa-fw"></i></a>';
            $acc_datos = '<a class="btn btn-xs btn-default" href="../Users/datospersonales/'."',User.id,'".'"  title="Datos Personales"><i class="fa fa-eye fa-fw"></i></a>';
            $acc_pagos = '<a class="btn btn-xs btn-info" href="../Movimientos/pagosrealizados/'."',User.id,'".'"  title="Pagos Realizados"><i class="fa fa-list fa-fw"></i></a>';
            $acc_elimina = '<a class="btn btn-xs btn-danger" onclick="elimina('."',User.id,'".')"  title="Eliminar"><i class="hi hi-remove fa-fw"></i></a>';
            $this->User->virtualFields = array(
                'nombre_completo' => 'CONCAT(User.nombres," ",User.ap_paterno," ",User.ap_materno)',
                'accion' => "CONCAT('$acc_edit $acc_pendientes $acc_datos $acc_pagos $acc_elimina')"
            );
            $this->paginate = array(
                'fields' => array('User.id','User.nombre_completo','User.ci','User.rni','Categoria.nombre','User.accion')
                ,'conditions' => array('User.role' => 'Colegiado')
                ,'order' => 'User.id DESC'
                ,'recursive' => 0
            );
            $this->DataTable->emptyEleget_usuarios_adminments = 1;
            $this->set('users', $this->DataTable->getResponse());
            $this->set('_serialize','users');
        }
        $colegiado = $this->User->find('all', array(
            'recursive' => 0,
            'order' => 'User.id DESC',
            'conditions' => array('User.role' => 'Colegiado')));
        $this->set(compact('colegiado'));
        //debug($colegiado);die;
    }
    public function editcolegiado($id = null)
    {
        $this->User->id = $id;
        if (!$id) {
            $this->Session->setFlash('No existe el Titulo');
            $this->redirect(array('action' => 'index'), null, true);
        }
        if (empty($this->request->data)) {
            $this->request->data = $this->User->read();
        } else {
            if ($this->User->save($this->request->data)) {
                $this->Session->setFlash('Los datos fueron modificados', 'mensajeBueno');
                $this->redirect(array('action' => 'colegiados'), null, true);
            } else {
                $this->Session->setFlash('no se pudo modificar!!','mensajeError');
            }
        }
        $categorias = $this->User->Categoria->find('list');
        $ciudades = $this->User->Ciudade->find('list');
        $paises = $this->User->Paise->find('list');
        $bancos = $this->User->Banco->find('list');
        $this->set(compact('categorias', 'ciudades', 'paises', 'bancos'));
    }

    public function login()
    {
        $this->layout = 'login';
        if ($this->request->is('post')) {
            //debug($this->request->data);die;
            if ($this->Auth->login()) {
                
                $role = $this->Session->read('Auth.User.role');
                 //debug($role);die;
                if($role == 'Administrador')
                {
                    $this->redirect(array('controller' => 'Users', 'action' => 'inicio'));
                }
                elseif($role == 'Colegiado')
                {
                    $this->redirect(array('controller' => 'Users', 'action' => 'datosusuario'));
                }elseif($role=='Secretaria'){
                    $this->redirect(array('controller'=>'Users','action'=>'inicio'));
                }
                else{
                    $this->redirect(array('controller' => 'Users', 'action' => 'login'));
                }
            } else {
                $this->Session->setFlash('Usuario o Password incorrectos.','msgerror');
            }
        }
    }

    public function salir()
    {
        $this->redirect($this->Auth->logouth());
        $this->redirect(array('action' => 'login'));
    }
    public function datospersonales($idColegiado = null)
    {

        $dcolegiado = $this->User->find('first', array(
            'recursive' => 0,
            //'order' => 'User.id DESC',
            'conditions' => array('User.role' => 'Colegiado','User.id' => $idColegiado)));
        $this->set(compact('dcolegiado'));
        //debug($dcolegiado);die;
    }


    public function logout()
    {
        return $this->redirect($this->Auth->logout());
    }
    public function inicio()
    {
          
    }
    public function cuotas($idUsercuotas = null)
    {
        $datosColegiado = $this->User->find('first', array('recursive' => -1,
                'conditions' => array('User.id' => $idUsercuotas)));
        //debug($datosColegiado);die;

        $movimientos = $this->Movimiento->find('all', array('recursive' => -1,
                'conditions' => array('Movimiento.estado' => 'Debe', 'Movimiento.user_id' => $idUsercuotas)
                ,'fields' => array('Movimiento.fecha_cuota','Movimiento.ingreso','Movimiento.tc','Movimiento.moneda')
                ));
        
        $parametros = $this->Parametro->find('first', array('recursive' => -1, ));
        
        $ultmovimiento = $this->Movimiento->find('first', array('recursive'=>-1,
                                                  'conditions'=>array('Movimiento.id'=>$idUsercuotas)));
        //debug($movimientos);die;
        $damovimientos = $this->Movimiento->find('all', array('recursive' => -1,
                'conditions' => array('Movimiento.estado' => 'Debe', 'Movimiento.user_id' => $idUsercuotas)
                ,'fields' => array('SUM(Movimiento.ingreso) total_ingreso','Movimiento.moneda')
                ));
        if ($this->request->is('post')) {

            //debug($this->request->data);die;
        }
        
        //debug($movimientos);
        $this->set(compact('movimientos', 'datosColegiado', 'parametros','ultmovimiento','damovimientos'));
    }

    public function detallecolegiado($idColegiado = null)
    {
        $datosColegiado = $this->User->find('first', array('recursive' => -1,
                'conditions' => array('User.id' => $idColegiado)));
        //debug($datosColegiado);die;
        $movimientos = $this->Movimiento->find('all', array('recursive' => -1,
                'conditions' => array('Movimiento.estado' => 'Debe', 'Movimiento.user_id' => $idColegiado)));
        //debug($movimientos);die;
        $feinicial = $this->Movimiento->find('first', array('recursive' => -1, 'order' =>
                'Movimiento.id ASC'));
        //debug($feinicial);die;


        $fefinal = $this->Movimiento->find('first', array('recursive' => -1, 'order' =>
                'Movimiento.id DESC'));
        //debug($fefinal);die;
        //$total = 

        $this->set(compact('datosColegiado', 'movimientos', 'feinicial', 'fefinal'));
        

    }
    public function calcula_total_ingresos()
    {
        $this->layout = 'ajax';
        //debug($this->request->data);exit;
        $fechaini = $this->request->data['User']['fecha_ini'];
        $fechafin = $this->request->data['User']['fecha_fin'];
        $idUsuario = $this->request->data['User']['id'];
        $total = 0.00;
        $numero = 0;
        $moneda = '';
        if(!empty($fechaini) && !empty($fechafin) && !empty($idUsuario))
        {
            $condiciones['Movimiento.fecha_cuota BETWEEN ? AND ?'] = array($fechaini,$fechafin);
            $condiciones['Movimiento.estado'] = 'Debe';
            $condiciones['Movimiento.user_id'] = $idUsuario;
            $movimiento = $this->Movimiento->find('all',array(
            'conditions' => $condiciones
            ,'fields' => array('SUM(Movimiento.ingreso) total','Movimiento.moneda')
            ));
            
            $numero = $this->Movimiento->find('count',array(
            'conditions' => $condiciones
            //,'fields' => array('SUM(Movimiento.ingreso) total')
            ));
            if(!empty($movimiento))
            {
                $total = $movimiento[0][0]['total'];
                $moneda = $movimiento[0]['Movimiento']['moneda'];
            }
            //debug($numero);
            //debug($movimiento);exit;
        }
        
        $this->set(compact('total','numero','moneda'));
        
    }
    public function colegiado($idUser = null)
    {
        $this->User->id = $idUser;
        $this->request->data = $this->User->read();
        $categorias = $this->Categoria->find('list',array('fields' => 'Categoria.nombre'));
        $paises = $this->Paise->find('list',array('fields' => 'Paise.nombre'));
        $ciudades = $this->Ciudade->find('list',array('fields' => 'Ciudade.nombre'));
        $this->set(compact('categorias','paises','ciudades'));
    }
    public function guarda_colegiado()
    {
        //debug($this->request->data);exit;
        if(!empty($this->request->data['User']['id']))
        {
            $valida = $this->validar('User');
            //debug($valida); die;
            if(empty($valida))
            {
                $archivoImagen = $this->request->data['User']['foto'];
                if ($archivoImagen['error'] === UPLOAD_ERR_OK)
                {
                    $dir=WWW_ROOT . 'img/fotos' . DS . $this->request->data['User']['id'].'.jpg';
                    if(file_exists($dir)) 
                    {
                        unlink($dir);
                    }
                    if(move_uploaded_file($archivoImagen['tmp_name'], WWW_ROOT . 'img/fotos' . DS . $this->request->data['User']['id'].'.jpg'))
                    {
                        $this->request->data['User']['foto'] = $this->request->data['User']['id'].'.jpg';
                        //debug($this->request->data['User']['foto']);exit;
                    }
                    else{
                        $this->request->data['User']['foto'] = NULL;
                    }
                }
                else{
                    $this->request->data['User']['foto'] = NULL;
                }

                if(!empty($this->request->data['User']['password_n']))
                {
                    $this->request->data['User']['password'] = $this->request->data['User']['password_n'];
                }
                $this->User->create();
                $this->User->save($this->request->data['User']);
                $this->genera_usuario($this->request->data['User']['id']);
                $this->Session->setFlash('Se guardo correctamente los datos','msgbueno');
                $this->redirect(array('action' => 'colegiados'));
                
            }
            else{
                $this->Session->setFlash($valida,'msgerror');
                $this->redirect(array('action' => 'colegiados'));
            }
        }
        else{
            $this->Session->setFlash('No se pudo guardar los datos','msgerror');
            $this->redirect(array('action' => 'colegiados'));
        }
    }
    public function genera_usuario($idUsuario = null)
    {
        $usuario = $this->User->find('first',array('recursive' => -1
            ,'conditions' =>array('User.id' => $idUsuario)));
        if(!empty($usuario))
        {
            if(empty($usuario['User']['username']))
            {
                $this->request->data['User']['username'] = $usuario['User']['rni'];
                $this->request->data['User']['password'] = $usuario['User']['ci'];
                $this->User->id = $idUsuario;
                $this->User->save($this->request->data['User']);
            }
        }
    }
    public function datosusuario()
    {
        $this->layout = 'colegiado';
        $usuario = $this->Session->read('Auth.User');
        $this->requestAction(array('controller' => 'Movimientos','action' => 'actualiza_pagos',$usuario['id']) );
        $movimientos = $this->Movimiento->find('all',array('recursive' => 0,'order' => 'Movimiento.id DESC',
            'conditions' => array('Movimiento.user_id' => $usuario['id'],'Movimiento.estado' => 'Pagado')));
        $movimientos2 = $this->Movimiento->find('all', array(
            'recursive' => 0,
            'conditions' => array('Movimiento.estado' => 'Debe', 'Movimiento.user_id' => $usuario['id'])
        ));
        $movimientos3 = $this->Movimiento->find('all',array(
            'recursive' => 0,'order' => 'Movimiento.id DESC',
            'conditions' => array('Movimiento.user_id' => $usuario['id'],'Movimiento.estado' => 'Pagado')
            ,'group' => array('Movimiento.parametro_id')
            ,'fields' => array('COUNT(Movimiento.id) cantidad','SUM(Movimiento.cuota) total','Movimiento.moneda','Parametro.nombre')
            ));
        $t_cambio = $this->get_tipo_cambio();
        $this->set(compact('movimientos','usuario','movimientos2','t_cambio','movimientos3'));
    }
}

?>
